﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.Data;
using System.Windows.Forms;
using System.IO;
using DBConnect;

namespace TISS_Add_in
{
    public static class StatusAutorizacao
    {

        /// <summary>
        /// Preenche Mensagem de Solicitação de Autorização
        /// </summary>
        /// <param name="codPrestadorOrigem"></param>
        /// <param name="regANSDestino"></param>
        /// <returns></returns>
        public static docTissStatusAutorizacao.ws_solicitacaoStatusAutorizacao geraSolicitacaoStatusAutorizacao(GuiaSolicitacaoProcedimento classGuiaSolicProc)
        {
            docTissStatusAutorizacao.ws_solicitacaoStatusAutorizacao enviaStatusAutorizacao =
                new TISS_Add_in.docTissStatusAutorizacao.ws_solicitacaoStatusAutorizacao();

            enviaStatusAutorizacao.cabecalho =
                (docTissStatusAutorizacao.cabecalhoTransacao)Cabecalho.GeraCabecalho(
                classGuiaSolicProc.CodPrestador, classGuiaSolicProc.RegANS, tipoTransacao.SOLICITA_STATUS_AUTORIZACAO);

            if (enviaStatusAutorizacao.cabecalho != null)
            {
                try
                {
                    enviaStatusAutorizacao.solicitacaoStatusAutorizacao = new TISS_Add_in.docTissStatusAutorizacao.ct_solicitaStatusAutorizacao();
                    DataRow drSolicitacao = CommandSolicitacao.buscaSolicProcedimentos(classGuiaSolicProc.CodPrestador, classGuiaSolicProc.RegANS).Rows[0];

                    enviaStatusAutorizacao.solicitacaoStatusAutorizacao.dataSolicitaStatus = DateTime.Now.Date.ToString("dd/MM/yyyy");

                    enviaStatusAutorizacao.solicitacaoStatusAutorizacao.identificacaoAutorizacao = new TISS_Add_in.docTissStatusAutorizacao.ArrayOfCt_solicitaStatusAutorizacaoIdentificacaoSolicitacaoIdentificacaoSolicitacao[1];
                    enviaStatusAutorizacao.solicitacaoStatusAutorizacao.identificacaoAutorizacao[0] = new TISS_Add_in.docTissStatusAutorizacao.ArrayOfCt_solicitaStatusAutorizacaoIdentificacaoSolicitacaoIdentificacaoSolicitacao();
                    enviaStatusAutorizacao.solicitacaoStatusAutorizacao.identificacaoAutorizacao[0].dataEmissaoGuia = drSolicitacao["dataEmissao"].ToString();
                    enviaStatusAutorizacao.solicitacaoStatusAutorizacao.identificacaoAutorizacao[0].registroANS = classGuiaSolicProc.RegANS;
                    enviaStatusAutorizacao.solicitacaoStatusAutorizacao.identificacaoAutorizacao[0].numeroGuiaPrestador = classGuiaSolicProc.NumeroGuia;
                    enviaStatusAutorizacao.solicitacaoStatusAutorizacao.identificacaoAutorizacao[0].numeroGuiaOperadora = drSolicitacao["numeroGuiaOperadora"].ToString();

                    enviaStatusAutorizacao.solicitacaoStatusAutorizacao.identificacaoAutorizacao[0].profissionalSolicitante = new TISS_Add_in.docTissStatusAutorizacao.ct_contratadoSolicitante();
                    enviaStatusAutorizacao.solicitacaoStatusAutorizacao.identificacaoAutorizacao[0].profissionalSolicitante.nomeContratado = Globals.ThisAddIn.PrestadorNome;
                    enviaStatusAutorizacao.solicitacaoStatusAutorizacao.identificacaoAutorizacao[0].profissionalSolicitante.identificacao = (docTissStatusAutorizacao.ct_identificacaoPrestador)enviaStatusAutorizacao.cabecalho.origem.Item;

                    #region Rodapé

                    //Fechando a Mensagem e Serializando em Memória
                    byte bufferMensagem = new byte();
                    XmlSerializer xsMensagem = new XmlSerializer(typeof(docTissStatusAutorizacao.ws_solicitacaoStatusAutorizacao));
                    Stream streamMensagem = new MemoryStream(bufferMensagem);
                    xsMensagem.Serialize(streamMensagem, enviaStatusAutorizacao);
                    streamMensagem.Position = 0;

                    //Fim da Mensagem: HASH
                    enviaStatusAutorizacao.hash = AddinUtils.CalculateMD5Hash(streamMensagem);

                    #endregion

                    return enviaStatusAutorizacao;
                }
                catch (Exception e)
                {
                    MessageBox.Show("Erro ao gerar o Solicitação de StatusAutorização: " + e.Message, "Solicitação não enviada!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    Mensagem.mensagemTISS_remove(Convert.ToInt64(enviaStatusAutorizacao.cabecalho.identificacaoTransacao.sequencialTransacao));
                    return null;
                }
            }
            return null;
        }

        public static void recebeStatusAutorizacao(docTissStatusAutorizacao.ws_situacaoAutorizacao statusAutorizacao, GuiaSolicitacaoProcedimento[] classGuiaSolicProc)
        {
            foreach (docTissStatusAutorizacao.ArrayOfCt_situacaoAutorizacaoDadosAutorizacaoDadosAutorizacao solicitacao in statusAutorizacao.situacaoAutorizacao)
            {
                foreach (GuiaSolicitacaoProcedimento classGuia in classGuiaSolicProc)
                {
                    if (solicitacao.identificacaoAutorizacao.numeroGuiaPrestador == classGuia.NumeroGuia)
                    {
                        docTissSolicitacaoProcedimento.ws_autorizacaoProcedimento reciboSolicitacao = new TISS_Add_in.docTissSolicitacaoProcedimento.ws_autorizacaoProcedimento();
                        reciboSolicitacao.autorizacaoServico = new TISS_Add_in.docTissSolicitacaoProcedimento.ws_autorizacaoProcedimentoAutorizacaoServico[1];
                        reciboSolicitacao.autorizacaoServico[0] = (docTissSolicitacaoProcedimento.ws_autorizacaoProcedimentoAutorizacaoServico)((object)solicitacao);
                        SolicitacaoProcedimentos.recebeSolicitacaoProcedimento(reciboSolicitacao, classGuia);
                        foreach (GuiaPath guiaPath in classGuia.GuiaPaths)
                        {
                            if (!guiaPath.IsExtensao)
                                AddinUtils.AbrirGuia(guiaPath.FilePath);
                        }
                    }
                }

            }
        }
    }
}
